package com.jia.leetCode;

import java.util.HashSet;
import java.util.Set;

/**
 * 874.模拟行走的机器人
 */
public class Pro0874 {
    /**
     * 在二维坐标上面行走（x, y）
     * 急需解决的问题是：左右转与东西南北的问题
     *  走一步
     *  北 0 (0, 1)
     *  东 1 (1, 0)
     *  南 2 (0, -1)
     *  西 3 (-1, 0)
     *  那么左右转与下表0 1 2 3关系
     *  假设面向北，那么向右转变成向东下表 + 1，考虑如果向西的话+1，那么需要取模 (index + 1）% 4；
     *            ，如果向左转那么变成向西 - 1, 下标为0 1 2 3，所以可以表示为 （index + 3) % 4;
     * @param commands
     * @param obstacles
     * @return
     */
    public int robotSim(int[] commands, int[][] obstacles) {
        if(commands == null || commands.length ==0) { return 0; }
        Set<String> set = new HashSet<String>();
        //hash存放障碍物点
        for(int[] obstacle : obstacles) {
            set.add(obstacle[0] + "," + obstacle[1]);
        }
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};

        int maxEulerDistance = 0;
        //方向下标
        int directory = 0;
        //起始坐标
        int x = 0, y = 0;
        for(int command : commands) {
            if(command == -1) { //右转
                directory = (directory + 1) % 4;
            }else if(command == -2) { //左转
                directory = (directory + 3) % 4;
            }else {
                //如果command是负数且不为-1、-2 那么direcory方向为反
                if(command < 0) {
                    directory = (directory + 2) % 4;
                    command = -command;
                }
                int index = 1;
                while(index <= command) {
                    //试探向directory方向走一步，判断是否是障碍点，如果是，直接退出，否则走下一步
                    int xx = x + dx[directory];
                    int yy = y + dy[directory];
                    if(set.contains(xx + "," + yy)) {
                        //如果为障碍点,退出
                        break;
                    }else {
                        maxEulerDistance = Math.max(maxEulerDistance, xx * xx + yy * yy);
                        x = xx;
                        y = yy;
                    }
                    ++index;
                }
            }
        }
        return maxEulerDistance;
    }

    public static void main(String[] args) {
        Pro0874 pro0874 = new Pro0874();
        int[] commands = {4,-1,3};
        int[][] obstacles= {};
        System.out.println(pro0874.robotSim(commands, obstacles));;
    }
}
